home *** CD-ROM | disk | FTP | other *** search
/ IRIX 6.2 / IRIX 6.2 CD2.iso / dist / print.idb / usr / sbin / mknetpr.z / mknetpr
Text File  |  1996-06-10  |  11KB  |  456 lines

  1. #!/bin/sh
  2. #Tag 0x00000700
  3. #**************************************************************************
  4. #*
  5. #*           Copyright (c) 1993 Silicon Graphics, Inc.
  6. #*            All Rights Reserved
  7. #*
  8. #*       THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF SGI
  9. #*
  10. #* The copyright notice above does not evidence any actual of intended
  11. #* publication of such source code, and is an unpublished work by Silicon
  12. #* Graphics, Inc. This material contains CONFIDENTIAL INFORMATION that is
  13. #* the property of Silicon Graphics, Inc. Any use, duplication or
  14. #* disclosure not specifically authorized by Silicon Graphics is strictly
  15. #* prohibited.
  16. #*
  17. #* RESTRICTED RIGHTS LEGEND:
  18. #*
  19. #* Use, duplication or disclosure by the Government is subject to
  20. #* restrictions as set forth in subdivision (c)(1)(ii) of the Rights in
  21. #* Technical Data and Computer Software clause at DFARS 52.227-7013,
  22. #* and/or in similar or successor clauses in the FAR, DOD or NASA FAR
  23. #* Supplement. Unpublished - rights reserved under the Copyright Laws of
  24. #* the United States. Contractor is SILICON GRAPHICS, INC., 2011 N.
  25. #* Shoreline Blvd., Mountain View, CA 94039-7311
  26. #**************************************************************************
  27. #*
  28. #* File: mknetpr
  29. #*
  30. #* $Revision: 1.23 $
  31. #*
  32. #* Description: Shell script for adding a remote printer to the local
  33. #*    System V spooling system.
  34. #*
  35. #*    Usage: mknetpr [<local printer name>] [<remote host>]
  36. #*               [<remote printer name>]
  37. #*
  38. #*    If the local printer name, remote printer name and remote
  39. #*    printer host are all specified on the command line, mknetpr does
  40. #*    not prompt for input and terminates upon encountering errors. If the
  41. #*    command line information is not complete, mknetpr runs interactively
  42. #*    prompting for the missing information and allowing recovery from
  43. #*    certain installation error conditions.
  44. #*
  45. #**************************************************************************
  46.  
  47.  
  48. # Well known directories and programs
  49.  
  50. LPUTIL_DIR=/usr/lib
  51. LPUTIL=$LPUTIL_DIR/lputil
  52. OUT_FILT="/usr/bin/pg -s -p more... -e"
  53. SPOOL_DIR=/var/spool/lp
  54. LPSTAT=/usr/bin/lpstat
  55. MKJTPR=/usr/sbin/mkjtpr
  56.  
  57.  
  58. # Global variables
  59.  
  60. LOCAL_PNAME=""
  61. REMOTE_PNAME=""
  62. REMOTE_HOST=""
  63. INTERACT=0
  64. REMOTE_ID="lp"
  65.  
  66.  
  67. #
  68. # Prints the program usage string
  69. #
  70. PrintUsage()
  71. {
  72.     echo "Usage: mknetpr [<local printer name>] [<remote host>] \c"
  73.     echo "[<remote printer name>]"
  74. }
  75.  
  76.  
  77. #
  78. # Checks that we are the super-user and verifies
  79. # that the System V spooling system is present
  80. #
  81. CheckPermSpooler()
  82. {
  83.     idstr=`id`
  84.     cid=`expr "$idstr" : '^[     ]*uid=.*(\(.*\))[     ]*gid='`
  85.     if [ "$cid" != "root" ]; then
  86.         echo "You must be logged in as root to use this program."
  87.         exit 1;
  88.     fi
  89.     if [ ! -r $SPOOL_DIR ]; then
  90.         echo "The System V spooling system is not installed on this system."
  91.         exit 1
  92.     fi
  93. }
  94.  
  95. #
  96. # Check for a duplicate printer name. Returns 0 if dup,
  97. # 1 if name is unique
  98. #
  99. CheckDupName()
  100. {
  101.     /bin/ls $SPOOL_DIR/member/$1 2> /dev/null 1> /dev/null
  102.     return $?
  103. }
  104.  
  105.  
  106. #
  107. # Query user for a name for the local printer
  108. #
  109. QueryLocalName()
  110. {
  111.     while [ "$LOCAL_PNAME" = "" ]; do
  112.         echo "Enter new printer name (14 chars max.): \c"
  113.         read LOCAL_PNAME
  114.         VerifyPname $LOCAL_PNAME
  115.         if [ $? -eq 1 ]; then
  116.         echo "Invalid response: Name must be 14 chars (A-Za-z0-9_ only)"
  117.         LOCAL_PNAME=""
  118.         fi
  119.         if [ "$LOCAL_PNAME" = "" ]; then
  120.         continue
  121.         fi
  122.     CheckDupName $LOCAL_PNAME
  123.         if [ $? -eq 0 ]; then
  124.         echo " "
  125.             echo "WARNING: Printer $LOCAL_PNAME already exists."
  126.             echo '\nChoose a new name (y/n)[y]? \c'
  127.             read yn
  128.             if [ \( "$yn" != "n" \) -a \( "$yn" != "N" \) ]; then
  129.             LOCAL_PNAME=""
  130.             fi
  131.         fi
  132.     done
  133. }
  134.  
  135.  
  136. #
  137. # Test for pure decimal positive integer input
  138. #
  139. # Expects $1 to be the value to check. Returns 0 if
  140. # OK, 1 if invalid positive integer or if more than one
  141. # argument specified
  142. #
  143. VerifyInt()
  144. {
  145.     if [ $# -eq 0 ]; then
  146.     return 0
  147.     fi
  148.     if [ $# -gt 1 ]; then
  149.     return 1
  150.     fi
  151.     echo $1 | egrep -s '^[0-9]*$'
  152.     return $?
  153. }
  154.  
  155.  
  156. #
  157. # Test for a valid printer name (i.e. 14 chars max, A-Za-z0-9_
  158. # only and no spaces)
  159. #
  160. VerifyPname()
  161. {
  162.     if [ $# -eq 0 ]; then
  163.     return 0
  164.     fi
  165.     if [ $# -gt 1 ]; then
  166.     return 1
  167.     fi
  168.     echo $1 | egrep -s '^[A-Za-z0-9_]*$'
  169.     if [ $? -eq 1 ]; then
  170.     return 1
  171.     fi
  172.     if [ `expr $1 : '.*'`  -gt 14 ]; then
  173.     return 1
  174.     fi
  175.     return 0
  176. }
  177.  
  178.  
  179. #
  180. # Test for a properly constructed remote host name
  181. #
  182. VerifyHostname()
  183. {
  184.     if [ $# -gt 1 ]; then
  185.     return 1
  186.     fi
  187.     return 0
  188. }
  189.  
  190.  
  191. #########################################################################
  192. #
  193. # Main program
  194. #
  195.  
  196. #
  197. # Ensure that we are root and that the main System V
  198. # spooling system directory is present
  199. #
  200. CheckPermSpooler
  201.  
  202. #
  203. # Get command line arguments, if any, and determine if we
  204. # should run in interactive mode
  205. #
  206. case $# in
  207.     0) INTERACT=1
  208.        ;;
  209.     1) INTERACT=1
  210.        LOCAL_PNAME=$1
  211.        ;;
  212.     2) INTERACT=1
  213.        LOCAL_PNAME=$1
  214.        REMOTE_HOST=$2
  215.        ;;
  216.     3) INTERACT=0
  217.        LOCAL_PNAME=$1
  218.        REMOTE_HOST=$2
  219.        REMOTE_PNAME=$3
  220.        ;;
  221.     *) PrintUsage
  222.        exit 1
  223.        ;;
  224. esac
  225.  
  226. #
  227. # Display an intro message
  228. #
  229. echo "Remote Printer Installation Tool\n"
  230.  
  231. # Ask user if this printer is directly on the network.  We handle that
  232. # with mkjtpr.  ONLY ask if INTERACTive is false because this script
  233. # can be called from the printer manager with all required arguments 
  234. # and in that case it should not query a user for info.  Test for mkjtpr
  235. # because it is part of Impressario and might not be installed (skip
  236. # this if not installed).
  237.  
  238. if [ "$INTERACT" != "0" ]; then
  239.   if [ -x $MKJTPR ]; then 
  240.      while [ "$NETPRINTER" = "" ]; do
  241.         echo "Spool files:"
  242.         echo ""
  243.         echo "1. Directly to a network printer.  A network printer is a printer"
  244.         echo "   connected to the network with a network card or network adaptor"
  245.         echo "   (i.e. an HP JetDirect card)?"
  246.         echo " "
  247.         echo "2. To another SGI workstation?"
  248.         echo " "
  249.         read NETPRINTER
  250.         VerifyInt $NETPRINTER
  251.         if [ $? -eq 1 ]; then
  252.              echo "Invalid response: Choice must be 1 or 2."
  253.              NETPRINTER=""
  254.         fi
  255.         if [ "$NETPRINTER" = "" ]; then
  256.              continue
  257.         fi
  258.         if [ \( "$NETPRINTER" != "1" \) -a \( "$NETPRINTER"  != "2" \) ]; then
  259.              echo "Invalid response: Choice must be 1 or 2."
  260.              NETPRINTER=""
  261.         fi
  262.  
  263.         if [ "$NETPRINTER" = "1" ]; then
  264.            $MKJTPR  "$LOCAL_PNAME" "$REMOTE_HOST"
  265.            exit $?
  266.         fi
  267.      done
  268.   fi
  269. fi
  270.  
  271. #
  272. # Make sure we have a remote printer host
  273. #
  274. if [ "$REMOTE_HOST" = "" ]; then
  275.     while [ "$REMOTE_HOST" = "" ]; do
  276.         echo "Enter remote host machine name: \c"
  277.         read REMOTE_HOST
  278.         VerifyHostname $REMOTE_HOST
  279.         if [ $? -eq 1 ]; then
  280.         echo "Invalid response: Improperly constructed hostname"
  281.         REMOTE_HOST=""
  282.         fi
  283.     done
  284.     echo " "
  285. fi
  286.  
  287. #
  288. # First test that we can talk to the remote host
  289. #
  290. echo "Testing connection to remote host $REMOTE_HOST...\n"
  291. REMOTE_NAMES=`$LPUTIL chkremote "$REMOTE_HOST" "$REMOTE_ID"`
  292. if [ $? -ne 0 ]; then
  293.     echo "Failed to connect to $REMOTE_HOST"
  294.     echo "Check that remote machine is up and allows login as $REMOTE_ID"
  295.     echo "You may need to run \"addclient(1M)\" on $REMOTE_HOST\n"
  296.     exit 1
  297. fi
  298.  
  299. #
  300. # Now make sure there are printers on the remote host
  301. #
  302. if [ "$REMOTE_NAMES" = "" ]; then
  303.     echo "There are either no printers connected to $REMOTE_HOST"
  304.     echo "or the network connection to $REMOTE_HOST has failed. Check"
  305.     echo "that the remote machine is up and has at least one printer"
  306.     echo "connected."
  307.     exit 1
  308. fi
  309.  
  310. echo "Connection to $REMOTE_HOST verified\n"
  311.  
  312. #
  313. # Query user for a name for this printer
  314. #
  315. if [ "$LOCAL_PNAME" = "" ]; then
  316.     QueryLocalName
  317.     echo " "
  318. else
  319.     echo "Requested local printer name: $LOCAL_PNAME\n"
  320.     VerifyPname $LOCAL_PNAME
  321.     if [ $? -eq 1 ]; then
  322.     echo "Error: Local printer name must be 14 chars (A-Za-z0-9_ only)"
  323.     if [ $INTERACT -eq 1 ]; then
  324.         LOCAL_PNAME=""
  325.         QueryLocalName
  326.         echo " "
  327.     else
  328.         exit 1
  329.     fi
  330.     fi
  331.     CheckDupName $LOCAL_PNAME
  332.     if [ \( $? -eq 0 \) -a \( $INTERACT -eq 1 \) ]; then
  333.     echo " "
  334.         echo "WARNING: Printer $LOCAL_PNAME already exists."
  335.         echo '\nChoose a new name (y/n)[y]? \c'
  336.         read yn
  337.         if [ \( "$yn" != "n" \) -a \( "$yn" != "N" \) ]; then
  338.         LOCAL_PNAME=""
  339.         QueryLocalName
  340.         echo " "
  341.         fi
  342.     fi
  343. fi
  344.  
  345. #
  346. # Now select the remote printer
  347. #
  348. if [ "$REMOTE_PNAME" = "" ]; then
  349.     echo "Printers on $REMOTE_HOST are:"
  350.     nump=0
  351.     for pname in $REMOTE_NAMES
  352.     do
  353.     nump=`expr $nump + 1`
  354.     echo "\t$nump. $pname"
  355.     done
  356.     rnum=""
  357.     while [ "$rnum" = "" ]; do
  358.         echo "Enter number of printer to install: \c"
  359.         read rnum
  360.         VerifyInt $rnum
  361.         if [ $? -eq 1 ]; then
  362.             echo "Invalid response: Printer number must be between 1 and $nump"
  363.             rnum=""
  364.         fi
  365.         if [ "$rnum" = "" ]; then
  366.             continue
  367.         fi
  368.         if [ \( $rnum -eq 0 \) -o \( $rnum -gt $nump \) ]; then
  369.             echo "Invalid response: Number must be between 1 and $nump"
  370.             rnum=""
  371.         fi
  372.     done
  373.     cnt=0
  374.     for pname in $REMOTE_NAMES
  375.     do
  376.     cnt=`expr $cnt + 1`
  377.     if [ $cnt -eq $rnum ]; then
  378.         REMOTE_PNAME=$pname
  379.         break
  380.     fi
  381.     done
  382. else
  383.     foundit=0
  384.     for pname in $REMOTE_NAMES
  385.     do
  386.     if [ "$pname" = "$REMOTE_PNAME" ]; then
  387.         foundit=1
  388.         break
  389.     fi
  390.     done
  391.     if [ $foundit -eq 0 ]; then
  392.     echo "Remote printer $REMOTE_PNAME not found on $REMOTE_HOST"
  393.     echo "Known printers on $REMOTE_HOST are:\n"
  394.     echo "$REMOTE_NAMES\n"
  395.     exit 1
  396.     fi
  397. fi
  398.  
  399. #
  400. # Inform the user of what comes next
  401. #
  402. echo " "
  403. echo "Installing remote printer $LOCAL_PNAME..."
  404. echo " "
  405.  
  406. #
  407. # Get the type and model name of the remote printer
  408. #
  409. rinfo=`$LPUTIL remoteinfo $REMOTE_HOST $REMOTE_PNAME $REMOTE_ID`
  410. if [ \( $? -ne 0 \) -o \( "$rinfo" = "" \) ]; then
  411.     echo "Could not get remote printer information"
  412.     echo "Check network connection and printer installation on remote host"
  413.     exit 1
  414. fi
  415. # Change IFS to parse newlines as separators.
  416. oldIFS=$IFS
  417. IFS='
  418. '
  419. for item in $rinfo
  420. do
  421.     val=`echo $item | egrep '^NAME='`
  422.     if [ "$val" != "" ]; then
  423.     NFLAG=$val
  424.     else
  425.         val=`echo $item | egrep '^TYPE='`
  426.         if [ "$val" != "" ]; then
  427.         TFLAG=$val
  428.     fi
  429.     fi
  430. done
  431. IFS=$oldIFS
  432.  
  433. #
  434. # Install the printer.
  435. #
  436. $LPUTIL addnet $REMOTE_HOST $REMOTE_PNAME $LOCAL_PNAME
  437. if [ $? -ne 0 ]; then
  438.     echo "ERROR: Installation of new printer failed."
  439.     echo "       $LPUTIL command failed."
  440.     exit 1
  441. fi
  442.  
  443. #
  444. # Inform the user of what has happened
  445. #
  446. echo "Remote printer $LOCAL_PNAME has been installed"
  447. echo " "
  448. echo "Here is your printing environment:"
  449. echo " "
  450. $LPSTAT -t | $OUT_FILT
  451.  
  452. #
  453. # Return a successful exit code
  454. #
  455. exit 0
  456.